Міністерствто освіти і науки України
Національний університет “Львівська політехніка”
Кафедра прикладної математики
Звіт
Лабораторна робота №2:
Лексичний аналізатор
Тема : Розглянути підмножину мови Pascal, у якій є ідентифікатори (довжина – не більше 10 символів), цілі константи (довжина – не більше 6 символів), дійсні константи з фіксованою крапкою ( довжина цілої частини – до 3 символів, дробової – до 5 символів), які використовуються у операторах опису (типи змінних – real , integer), оператори присвоєння, складні оператори (begin … end) умовні оператори (коротка форма, умова – одна операція порівняння).
Код програми :
using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace SysProgLab2
{
public partial class Form1 : Form
{
ArrayList list = new ArrayList();
string s;
string[] service ={"and","begin","real","integer","var","program","or"};
string[] ssplit;
public Form1()
{
InitializeComponent();
}
private void button3_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
s = textBox1.Text;
ssplit = s.Split(new char[] {'\r',',','\n',' ','<','>',':','=',';'},StringSplitOptions.RemoveEmptyEntries);
foreach (string stemp in ssplit)
{
transefer(stemp);
}
for (int k = 1; k < s.Length; k++)
{
if (s[k] == '=')
{
if (!Char.IsDigit(s[k + 1]) && !char.IsLetter(s[k + 1])) Err(k);
if (!Char.IsDigit(s[k - 1]) && !char.IsLetter(s[k - 1]) && s[k - 1] != '>' && s[k - 1] != '<' && s[k - 1] != ':') Err(k);
}
if (s[k] == ':')
{
if (s[k + 1] != '=' && s[k + 1] != 'r' && s[k + 1] != 'i') Err(k);
if (!char.IsLetter(s[k - 1]) && !char.IsDigit(s[k - 1])) Err(k);
}
if (s[k] == '.')
{
if (!char.IsLetter(s[k + 1]) && !char.IsDigit(s[k + 1])) Err(k);
if (!char.IsLetter(s[k - 1]) && !char.IsDigit(s[k - 1])) Err(k);
}
if (s[k] == '>')
{
if (!char.IsLetter(s[k + 1]) && !char.IsDigit(s[k + 1])&&s[k+1]!='=') Err(k);
if (!char.IsLetter(s[k - 1]) && !char.IsDigit(s[k - 1])&&s[k-1]!='<') Err(k);
}
if (s[k] == '<')
{
if (!char.IsLetter(s[k + 1]) && !char.IsDigit(s[k + 1]) && s[k + 1] != '=' && s[k - 1] != '<') Err(k);
if (!char.IsLetter(s[k - 1]) && !char.IsDigit(s[k - 1]) ) Err(k);
}
}
public bool isIndef(char[] ch)
{
if (ch[0] != '_' && !Char.IsLetter(ch[0])) return false;
if (ch[0] == '_' && !char.IsLetter(ch[1])) return false;
for (int i = 1; i < ch.Length; i++)
{
if (!char.IsLetter(ch[i]) && !char.IsDigit(ch[i]) && ch[i] != '_') return false;
}
return true;
}
public void Err(int i)
{
if (MessageBox.Show("Error in statement", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error) == DialogResult.OK)
{
textBox1.Focus();
textBox1.Select(i, 1);
}
}
public bool isDConst(char[] ch)
{
int pr = 0;
if (!char.IsDigit(ch[0])) return false;
for (int i = 1; i < ch.Length; i++)
{
if (ch[i] == '...